/*
1:下载axios
2:导入axios
3:创建axios副本（设置基地址）
4:设置请求与响应拦截
5：暴露出去
6：api中导入使用

*/
/*
    环境变量
    开发环境与生产环境
    开发环境  
      创建一个.env.development 文件
      定义变量  规则：以 VITE_开头
        VITE_XXX='123'
      访问变量:  import.meta.env.VITE_XXX
     生产环境
       创建一个.env.production 文件
      定义变量  规则：以 VITE_开头
        VITE_XXX='123'
      访问变量:  import.meta.env.VITE_XXX
    */
import axios, { type Method } from 'axios'
import type { ApiRes } from '@/types/test'
import { showFailToast } from 'vant'
import { useUserStore } from '@/stores'
import router from '@/router' // router===this.$router
// ts使用路由和vue2的js一样

const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_URL
})
instance.interceptors.request.use(
  config => {
    const store = useUserStore()
    if (store.userInfo?.token) {
      config.headers.Authorization = `Bearer ${store.userInfo?.token}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)
instance.interceptors.response.use(
  res => {
    /*
  状态码
     2开头：成功
     301:永久重定向
     302：临时重定向
     304：协商缓存（强缓存与协商缓存）
     400:请求参数等配制错误
     401:无权限（token失效）
     403：无资源的访问权限
     404：地址不存在
     5开头：基本都是服务器问题
*/

    if (res.data.code === 10000) {
      return res.data
    } else {
      // 提示
      showFailToast(res.data.message)
      return Promise.reject(new Error(res.data.message))
    }
  },
  err => {
    //   识别到401
    //   删除token与用户信息，跳转到登录页
    /*
      2开头：成功
      301：永久重定向
      302:临时重定向
      304:协商缓存
      400:请求参数错误
      401: 没有请求权限
      403：没有资源权限
      404：地址不存在
      5开头：服务器错误    
    */
    console.dir(err)
    if (err.response && err.response.status === 401) {
      console.log(router)

      const store = useUserStore()
      store.logout()
      showFailToast(err.response.data.message)
      // 裁切肯定拿到当前路由
      router.push('/login?redirect=' + encodeURIComponent(router.currentRoute.value.fullPath))
      // router.push('/login?redirect=' + location.pathname + location.search)
    }

    return Promise.reject(err)
  }
)

// function fn<T>(s:T):T{
//     return s
// }
// fn<string>('1')

function request<T> (url: string, method: Method = 'GET', data: object = {}) {
  return instance<any, ApiRes<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: data
  })
}

export default request
